package com.gyf.algorithm.leetcode;

import com.gyf.algorithm.structure.linerlist.List;

//给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
//
// 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
//
// 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
//
// 示例：
//
// 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
//输出：7 -> 0 -> 8
//原因：342 + 465 = 807
//
// Related Topics 链表 数学
public class S2TwoNumberAdd {
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null && l2 == null) {
            return null;
        }
        ListNode dummyNode = new ListNode(0);
        ListNode head = dummyNode;
        int addOne = 0;
        while (l1 != null || l2 != null || addOne != 0) {
            int value1 = l1 == null ? 0 : l1.val;
            int value2 = l2 == null ? 0 : l2.val;
            int sum = value1 + value2 + addOne;
            head.next = new ListNode(sum % 10);
            head = head.next;
            addOne = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        return dummyNode.next;
    }

    private static class ListNode {
        private int val;
        private ListNode next;

        public ListNode(int val) {
            this.val = val;
        }

        public static String print(ListNode l) {
            StringBuffer s = new StringBuffer();
            while (l != null) {
                s.append(l.val);
                l = l.next;
            }
            return s.toString();
        }
    }

    public static void main(String[] args) {
        ListNode list = new ListNode(2);
        ListNode list1 = new ListNode(8);
        list.next = new ListNode(4);
        list1.next = new ListNode(6);
        System.out.println(ListNode.print(addTwoNumbers(list, list1)));
    }
}
